/**
 * 创建全局执行上下文，foo 函数调用时创建 foo 函数的执行上下文
 * foo函数内部还有 baz 的调用，因此要创建 baz的执行上下文
 * 在作用域链中查找每个作用域中需要使用的变量
 * baz 中需要用到 age，自己有，直接用
 * baz 中需要用到 name，自己没有，顺着链往上找，找到了 foo，
 * foo 中也没有定义 name 属性，再往上找，发现全局定义了 name = 'name'
 * 在调用 foo 函数时，对全局 name 进行了更新，因此 name = 'name2'
 */
var name = 'name'
function foo () {
  name = 'name2' // name 属于全局，这里只是更新
  function baz () {
    var age = 12
    console.log(age)
    console.log(name)
  }
  baz()
}
foo()

// 优化后
var name = 'name'
function foo2 () {
  var name = 'name2' // name 属于全局，这里只是更新
  function baz2 () {
    var age = 12
    console.log(age)
    console.log(name)
  }
  baz2()
}
foo2()